"""
生成器介绍：
    概述：
        生成器是一种特殊的迭代器，用来生成数据的，使用一个元素，生成一个元素，这样可以节省大量的内存空间
    白话：
        生成器是推导式的写法，类似于我们之前学习的列表推导式，生成；列表、集合、字典等，只不过这里换成了小括号

    实现方式：
        1：使用推导式写法()
        2：使用关键字yield
"""
# 需求1：演示生成器的推导式写法
# 生成1-5的数字，尝试使用“元祖”推导式的写法
tuple1 = (i for i in range(1, 6))
print(tuple1)       # 地址值：<generator object <genexpr> at 0x0000020EB0E5EA20>
# 这里会调用next函数读取第一个元素，一旦第一个元素读取出来，记录读取位置，那么tuple1就会从下一个元素开始读取
print(next(tuple1))
print("-------------------------")
for i in tuple1:
    print(i)

# 需求2：演示生成器的yield关键字，实现get_list函数，返回1个包含1-5整数的列表
def get_list():
    # 定义一个空列表
    my_list = []
    # 遍历，获取到1-5的整数
    for i in range(1, 6):
        my_list.append(i)
    # 返回列表
    return my_list

def get_generator():
    # yield关键字，获取生成器对象
    for i in range(1, 6):
        yield i # 将每个i的值都放到生成器对象中，函数结束后，会返回生成器对象，生成器对象是一个迭代器对象
                # yield作用：1：创建生成器，2：把i的每个值放到生成器中

if __name__ == '__main__':
    print("------------------------------------")
    list1 = get_list()
    print(list1)

    print("------------------------------------")
    my_g = get_generator()
    print(my_g)
    # print(next(my_g))
    # print(next(my_g))
    # print(next(my_g))
    # print(next(my_g))
    # print(next(my_g))

    print("------------------------------------")
    for i in my_g:
        print(i)
